package com.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.basic.domain.PageResult;
import com.demo.pojo.DbLock;
import com.demo.service.criteria.DbLockQueryCriteria;
import com.demo.service.dto.DbLockDto;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  数据库锁
 * </p>
 *
 * @author author
 * @since 2024-10-29
 */
public interface IDbLockService extends IService<DbLock> {

    <T> T tryLock(String key, Callable<T> callable) throws Exception;
    
    <T> T tryLock(String key, Callable<T> callable, long waitTime, TimeUnit unit) throws Exception;
    
    void releaseAll();


    // 更新或者添加数据
    DbLockDto saveOrUpdate(DbLockDto dbLockDto);

    // 查询所有符合criteria条件的数据
    List<DbLockDto> queryAll(DbLockQueryCriteria criteria);

    // 分页查询所有符合criteria条件的数据
    PageResult<DbLockDto> queryAll(DbLockQueryCriteria criteria, Pageable pageable);

    // 根据id获取数据
    DbLockDto queryById(Long id);

    // 根据用户条件获取一个用户信息，如果条件符合多个数据则取第一条
    DbLockDto queryOne(DbLockQueryCriteria criteria);

    // 统计数量
    Long count(DbLockQueryCriteria criteria);

    // 获取一条对应条件的用户实体数据
    DbLock getOne(DbLockQueryCriteria criteria);

    // 获取所有对应条件的用户实体数据
    List<DbLock> getAll(DbLockQueryCriteria criteria);

    // 根据id逻辑删除
    int deleteId(Long id);

    // 根据条件逻辑删除
    int deleteByMore(DbLockQueryCriteria criteria);

    List<DbLock> testXml();
}
